<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Server Configuration Reference - The JK Connector</title><meta name="author" value="Remy Maucherat"><meta name="email" value="remm@apache.org"></head><body bgcolor="#ffffff" text="#000000" link="#525D76" alink="#525D76" vlink="#525D76"><table border="0" width="100%" cellspacing="0"><!--PAGE HEADER--><tr><td><!--PROJECT LOGO--><a href="http://jakarta.apache.org/tomcat/"><img src="../../images/tomcat.gif" align="right" alt="
    The Tomcat Servlet/JSP Container
  " border="0"></a></td><td><font face="arial,helvetica,sanserif"><h1>Apache Tomcat 4</h1></font></td><td><!--APACHE LOGO--><a href="http://www.apache.org/"><img src="../../images/asf-logo.gif" align="right" alt="Apache Logo" border="0"></a></td></tr></table><table border="0" width="100%" cellspacing="4"><!--HEADER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><tr><!--RIGHT SIDE MAIN BODY--><td width="80%" valign="top" align="left"><table border="0" width="100%" cellspacing="4"><tr><td align="left" valign="top" nowrap="true"><h1>The JK Connector</h1></td><td align="right" valign="top" nowrap="true"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>
  <p>The <strong>JK Connector</strong> is a web server component used to
  invisibly integrate Tomcat
 with a web server such as Apache or IIS.
  Communication between the web server and Tomcat is via the <code>JK</code>
  protocol (also known as the <code>AJP</code> protocol).</p>

  <p>Tomact is usually integrated with a web server in cases where you want
  the web server to handle the static content contained in the web application,
  and/or utilize the web server's SSL processing.  In many application
  environments, this will result in better overall performance than running
  your applications under Tomcat stand-alone using the <a href="coyote.html">
  Coyote HTTP/1.1 Connector</a>. However, the only way to know for sure whether
  it will provide better performance for <strong>your</strong> application is
  to try it both ways.</p>

</blockquote></td></tr></table><table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#525D76"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Configuration HOWTOs"><strong>Configuration HOWTOs</strong></a></font></td></tr><tr><td><blockquote>

  <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Apache"><strong>Apache</strong></a></font></td></tr><tr><td><blockquote>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>

        <p>This section explains how to connect Tomcat 4 to the popular
        open source web server, Apache.  It was originally part of
        <i>Tomcat: A Minimalistic User's Guide</i> by Gal Shachor, but
        has been split off for organizational reasons.  It should be
        considered a <b>work in progress</b>.  Since the Tomcat source
        tree is constantly changing, the information herein may be out
        of date.  The only definitive reference at this point is the <a href="http://jakarta.apache.org/site/sourceindex.html">source
        code</a>.</p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Installation"><strong>Installation</strong></a></font></td></tr><tr><td><blockquote>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Needed Components"><strong>Needed Components</strong></a></font></td></tr><tr><td><blockquote>

          <p>In a nutshell a web server is waiting for client HTTP requests.
          When these requests arrive the server does whatever is needed to 
          serve the requests by providing the necessary content. Adding a 
          servlet container may somewhat change this behavior. Now the web 
          server needs also to perform the following:</p>

          <ul>
            <li>Load the servlet container adapter library 
            and initialize it (prior to serving requests). </li>
            <li>When a request arrives, it needs to check and see if a certain 
            request belongs to a servlet, if so it needs to let the adapter
            take the request and handle it.</li>
          </ul>

          <p>The adapter on the other hand needs to know what requests it is
          going to serve, usually based on some pattern in the request URL, 
          and to where to direct these requests.</p>

          <p>Things are even more complex when the user wants to set 
          a configuration that uses virtual hosts, or when they want multiple 
          developers to work on the same web server but on different servlet 
          container JVMs. We will cover these two cases 
          in the advanced sections.</p>

        </blockquote></td></tr></table>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="mod_jk Terminology"><strong>mod_jk Terminology</strong></a></font></td></tr><tr><td><blockquote>

           <p>The following terms are used in this section:</p>

           <ul>
              <li><strong>Worker process</strong> - A worker is a Tomcat 
              instance that is running to serve servlet requests coming 
              from the web server. In most cases there is only a single worker
              (the one and only Tomcat process) but sometimes you will run 
              multiple workers to achieve load balancing or site partitioning.
              Each worker is identified to the web server by the host were 
              it is located, the port where it listens and the communication 
              protocol used to exchange messages.</li>
              <li><strong>In-Process Worker</strong> - This is a special 
              worker. Instead of working with a Tomcat process residing on 
              another process, the web server opens a JVM and executes 
              Tomcat inside the web server process address space. 
              Our discussion in this document is not going to get into this 
              special worker. Note: Tomcat 4 can't be run as this type of 
              worker at the moment.</li>
              <li><strong>Web Server Plug-in/Tomcat Redirector</strong> - 
              For Tomcat to cooperate with any web server it needs an "agent" 
              to reside in the web server and send Tomcat servlet requests. 
              This is the web server plug-in, and in our case the web server 
              plug-in is mod_jk. The redirector usually comes in the shape of 
              a DLL or shared object module that you plug into 
              the web server.</li>
              <li><strong>Plug-in Configuration</strong> - We need to 
              configure the web server plug-in so that it knows where 
              the different Tomcat workers are and to which of them 
              it should forward requests. This information, accompanied with 
              some internal parameters, such as the log level, comprises 
              the plug-in configuration.</li>
              <li><strong>Web Server Configuration</strong> - Each web server 
              has some configuration that defines its behavior, e.g. on which 
              port to listen, what files to serve, what web server plug-ins 
              to load, etc. You will need to modify your web server 
              configuration to instruct it to load the Tomcat 
              redirector mod_jk.</li>
           </ul>

        </blockquote></td></tr></table>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Getting mod_jk"><strong>Getting mod_jk</strong></a></font></td></tr><tr><td><blockquote>

           <p>The mod_jk source now resides in the jakarta-tomcat-connectors
           subproject. Please refer to it for build instructions.</p>

           <p>Binaries for mod_jk are available for several platforms in the 
           same area as the Tomcat Binary Release.  The binaries are located 
           in subdirectories by platform. For some platforms, such as Windows,
           this is the typical way of obtaining mod_jk since most Windows 
           systems do not have C compilers.  For others, the binary 
           distribution of mod_jk offers simpler installation.</p>

           <p><strong>Note: Note: The version of mod_jk is not dependent on 
           the version of Tomcat. The Tomcat 3.3 distribution of mod_jk will 
           function correctly with Tomcat 4.x and other 3.x versions of 
           Tomcat, such as Tomcat 3.2.1.</strong></p>

        </blockquote></td></tr></table>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Configuring Apache"><strong>Configuring Apache</strong></a></font></td></tr><tr><td><blockquote>

           <p>If you've previously configured Apache to use mod_jserv, remove 
           any ApJServMount directives from your httpd.conf. If you're 
           including tomcat-apache.conf or tomcat.conf, you'll want to remove 
           them as well - they are specific to mod_jserv. 
           The mod_jserv configuration directives are not compatible 
           with mod_jk!</p>

           <p>Like Tomcat 3, Tomcat 4 can automatically generate the 
           necessary <code>$CATALINA_HOME/conf/mod_jk.conf</code>,
           but it can also be created manually. Note that Tomcat 
           and Apache must be restarted after adding a new context.
           See the "Using ApacheConfig" section for more details.</p>

           <p><strong>Basic configuration</strong></p>

           <p>
           <ul>
              <li>You will need to instruct Apache to load Tomcat. This can be
              done with Apache's LoadModule and AddModule configuration 
              directives.</li>
              <li>You must inform mod_jk the location of your 
              workers.properties file. Use mod_jk's JkWorkersFile 
              configuration directive.</li>
              <li>You should specify a location where mod_jk is going to place
              its log file and a log level to be used. Use the JkLogFile and 
              JkLogLevel configuration directives. Possible log levels are 
              debug, info, error and emerg. If the JkLogLevel is not specified,
              no log is generated.</li>
              <li>The directive JkLogStampFormat will configure the date/time 
              format found on mod_jk logfile. Using strftime() format string 
              it's set by default to "[%a %b %d %H:%M:%S %Y] "</li>
              <li>Use mod_jk's JkMount directive to assign specific URLs to 
              Tomcat. In general the structure of a JkMount directive is:
              <code>JkMount URL_PREFIX WORKER_NAME</code>. You can use the 
              JkMount directive at the top level or inside &lt;VirtualHost&gt;
              sections of your httpd.conf file.</li>
              <li>The directive <tt>JkRequestLogFormat</tt> (Apache 1.3 only)
              will configure the format of mod_jk
              individual request logging. Request logging is configured and enabled on a per
              virtual host basis.  To enable request logging for a virtual host just add
              a JkRequestLogFormat config.
              The syntax of the format string is similiar to the Apache LogFormat command,
              here is a list of the avaialbe request log format options:
                  <ul>
                    <li>%b - Bytes sent, excluding HTTP headers. In CLF format</li>
                    <li>%B - Bytes sent, excluding HTTP headers.</li>
                    <li>%H - The request protocol</li>
                    <li>%m - The request method</li>
                    <li>%p - The canonical Port of the server serving the request</li>
                    <li>%q - The query string (prepended with a ? if a query string exists,
                             otherwise an empty string)</li>
                    <li>%r - First line of request</li>
                    <li>%s - request HTTP status code</li>
                    <li>%T - Requset duration, elapsed time to handle request in seconds '.'
                             micro seconds</li>
                    <li>%U - The URL path requested, not including any query string.</li>
                    <li>%v - The canonical ServerName of the server serving the request.</li>
                    <li>%V - The server name according to the UseCanonicalName setting.</li>
                    <li>%w - Tomcat worker name</li>
                  </ul>
              </li>
           </ul>
           A simple example would be to include the following lines in your <tt>httpd.conf</tt> file:
           <pre>
           LoadModule    jk_module  libexec/mod_jk.so
           AddModule     mod_jk.c
           JkWorkersFile /usr/local/jakarta-tomcat/conf/workers.properties
           JkLogFile     /usr/local/apache/logs/mod_jk.log
           JkLogLevel    info
           JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
           </pre>
           </p>

           <p><strong>Assigning URLs to Tomcat</strong></p>
           <p>If you have created a custom or local version of <tt>mod_jk.conf-local</tt>
            as noted above, you can change settings such as the workers or URL prefix.</p>
           
           <p>Use mod_jk's JkMount directive to assign specific URLs to Tomcat. In general
           the structure of a JkMount directive is:</p>
           
           <pre>
           JkMount <i>&lt;URL prefix&gt;</i> <i>&lt;Worker name&gt;</i>
           </pre>
           
           <p>For example the following directives will send all requests ending in
           <tt>.jsp</tt> or with <tt>/servlet</tt> as the second path componenet to
           the "<tt>ajp13</tt>" worker, but jsp requests to files located
           in /otherworker will go to "<tt>remoteworker</tt>".
           
           <pre>
           JkMount /*.jsp ajp13
           JkMount /*/servlet/ ajp13
           JkMount /otherworker/*.jsp remoteworker
           </pre>
           You  can use the <tt>JkMount</tt> directive at the top level or inside <tt>&lt;VirtualHost&gt;</tt>
           sections of your httpd.conf file.
           </p>
           
           <p><strong>Configuring Apache to serve static web application files</strong></p>
           <p>If the Tomcat Host appBase (webapps) directory is accessible by the Apache
           web server, Apache can be configured to serve web application context directory
           static files instead of passing the request to Tomcat.</p>
           
           <p><b>Caution:</b> If Apache is configured to serve static pages for a web
           application it bypasses any security contraints you may have configured in
           your web application web.xml config file.</p>
           
           <p>Use Apache's Alias directive to map a single web application context directory
           into Apache's document space for a VirtualHost:
           
           <pre>
           # Static files in the examples webapp are served by apache
           Alias /examples /export/home/web/host1/webapps/examples
           
           JkMount /*.jsp ajp13
           JkMount /*/servlet/ ajp13
           </pre>
           </p>
           
           <p>Use the mod_jk JkAutoAlias (Apache 1.3 only) directive to map all web application context
           directories into Apache's document space. Attempts to access the <code>WEB-INF</code>
           or <code>META-INF</code> directories within a web application context or a
           Web Archive <code>*.war</code> within the Tomcat Host appBase (webapps) directory
           will fail with an HTTP 403, Access Forbidden.</p>
           <p>
           Example configuration for an Apache VirtualHost:
           
           <pre>
           # Static files in all Tomcat webapp context directories are served by apache
           JkAutoAlias /export/home/web/host2/webapps
           
           JkMount /*.jsp ajp13
           JkMount /*/servlet/ ajp13
           </pre>
           </p>

        </blockquote></td></tr></table>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Configuring Tomcat"><strong>Configuring Tomcat</strong></a></font></td></tr><tr><td><blockquote>

           <p>Tomcat 4 can be configured to automatically generate the Apache 
	     configuration file.  The next section describes how to enable
	     this option.</p>

           <p>After enabling the AJP 1.3 connector, you need to define workers,
           using a <code>$CATALINA_HOME/conf/workers.properties</code> file.
           In most cases, using the example workers.properties given below
           should work fine, after changing the path values to reflect how your
           environment is set up.</p>

        </blockquote></td></tr></table>

	<table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Using ApacheConfig"><strong>Using ApacheConfig</strong></a></font></td></tr><tr><td><blockquote>

	  <p>Tomcat 4 provides extra flexability over Tomcat 3 in setting up 
	     the automatic generation of the Apache configuration file.  
	     However, this comes at the cost of a bit more complexity.  Each
	     time that Tomcat is started, it will write the configuration file
	     to <code>$CATALINA_HOME/conf/auto/mod_jk.conf</code>.  You can 
	     then either
	     <div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>Include $CATALINA_HOME/conf/auto/mod_jk.conf</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
	      in your <code>httpd.conf</code> file.</p>

	  <p>To generate the global Apache directives (e.g. 
	     <code>LoadModule</code>, <code>JkLogFile</code>), you define a
	     <code>Server</code> Listener:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
   &lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;
     &lt;Listener className="org.apache.ajp.tomcat4.config.ApacheConfig" /&gt;
     ...
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

          <p>To configure the individual context information, you then either
	     define a <code>Host</code> Listener or a <code>Context</code> 
	     Listener depending on if you are using virutal hosting or not.
	     Defining a <code>Host</code> Listener will generate the Apache
	     <code>&lt;VirtualHost&gt;</code> directive and include all of
	     the configurations for the <code>Contexts</code> under this host.
	     Using the <code>Context</code> Listener allows you the flexability
	     to configure the <code>Context</code> the same way even if it
	     is being served from several hosts.</p>

	  <p>Except for the placement of the <code>&lt;Listener ...&gt;</code>,
	     the syntax is virtualy identical for the <code>Host</code>
	     Listener and the <code>Context</code> Listener.  The examples that
	     follow will demonstrate the functionality for a <code>Host</code>
	     Listener.  The simplest configuration is:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
    &lt;Host name="localhost" debug="0" appbase="webapps" &gt;
      &lt;Listener className="org.apache.ajp.tomcat4.config.ApacheConfig" 
          append="true" /&gt;
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

        <p>It is possible to modify the output configuration file with the 
	   following attributes:</p>

	<table border="1" cellpadding="5"><tr><th width="15%" bgcolor="#023264"><font color="#ffffff">Attribute</font></th><th width="85%" bgcolor="#023264"><font color="#ffffff">Description</font></th></tr><tr><td align="left" valign="center"><code>configHome</code></td><td align="left" valign="center">
	    Default parent directory for the following paths. If not set, this
	     defaults to CATALINA_HOME. Ignored whenever any of the following 
	     paths is absolute
	  </td></tr><tr><td align="left" valign="center"><code>jkConfig</code></td><td align="left" valign="center">
	  Path to write apacke mod_jk conf file to. If not set, defaults to 
	  "conf/auto/mod_jk.conf". 
	  </td></tr><tr><td align="left" valign="center"><code>workersConfig</code></td><td align="left" valign="center">
	    Path to workers.properties file used by mod_jk. If not set, 
	    defaults to "conf/jk/workers.properties". 
	  </td></tr><tr><td align="left" valign="center"><code>modJk</code></td><td align="left" valign="center">
	  Path to Apache mod_jk plugin file. If not set, defaults to 
	  "modules/mod_jk.dll" on windows, "modules/mod_jk.nlm" on netware, 
	  and "libexec/mod_jk.so" everywhere else. 
	  </td></tr><tr><td align="left" valign="center"><code>jkLog</code></td><td align="left" valign="center">
	  Path to log file to be used by mod_jk
	  </td></tr><tr><td align="left" valign="center"><code>jkDebug</code></td><td align="left" valign="center">
	    JK Loglevel setting. May be debug, info, error, or emerg. If not 
	    set, defaults to no log. 
	  </td></tr><tr><td align="left" valign="center"><code>jkWorker</code></td><td align="left" valign="center">
	    The desired worker. Must be set to one of the workers defined in 
	    the workers.properties file.  "ajp13" or "inprocess" are 
	    the workers found in the default workers.properties file. If not 
	    specified, defaults to "ajp13".
	  </td></tr><tr><td align="left" valign="center"><code>forwardAll</code></td><td align="left" valign="center">
	    If true, forward all requests to Tomcat. This helps ensure that 
	    all the behavior configured in the web.xml file functions 
	    correctly. If false, let Apache serve static resources. The 
	    default is true. Warning: When false, some configuration in the 
	    web.xml may not be duplicated in Apache. Review the mod_jk conf 
	    file to see what configuration is actually being set in Apache. 
	  </td></tr><tr><td align="left" valign="center"><code>noRoot</code></td><td align="left" valign="center">
	  If true, the root context is not mapped to Tomcat. If false and 
	  forwardAll is true, all requests to the root context are mapped to 
	  Tomcat. If false and forwardAll is false, only JSP and servlets 
	  requests to the root context are mapped to Tomcat. When false, to 
	  correctly serve Tomcat's root context you must also modify the 
	  DocumentRoot setting in Apache's httpd.conf file to point to 
	  Tomcat's root context directory. Otherwise some content, such as 
	  Apache's index.html, will be served by Apache before mod_jk gets a 
	  chance to claim the request and pass it to Tomcat. The default is 
	  true.</td></tr><tr><td align="left" valign="center"><code>append</code></td><td align="left" valign="center">
	    Append to the current configuration file.
	  </td></tr></table>

	</blockquote></td></tr></table>

        <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Example Configuration Files"><strong>Example Configuration Files</strong></a></font></td></tr><tr><td><blockquote>

           <p>Excerpt from workers.properties showing the Ajp13 worker:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
# Setup for Solaris system
#
workers.tomcat_home=/usr/local/jakarta-tomcat
workers.java_home=/usr/java
ps=/
worker.list=ajp12, ajp13

# Definition for Ajp13 worker
#
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

           <p>Excerpt from Apaches httpd.conf showing JK directives:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
# Load mod_jk
#
LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c

# Configure mod_jk
#
JkWorkersFile /usr/local/jakarta-tomcat/conf/jk/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info

# First Virtual Host.
#
&lt;VirtualHost 10.0.0.1:80&gt;
DocumentRoot /web/host1
ServerName host1.apache.org
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
&lt;/VirtualHost&gt;

# Second Virtual Host. Also accessible via HTTPS
#
&lt;VirtualHost 10.0.0.2:80&gt;
DocumentRoot /web/host2
ServerName host2.apache.org
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
&lt;/VirtualHost&gt;

&lt;VirtualHost 10.0.0.2:443&gt;
DocumentRoot /web/host2
ServerName host2.apache.org
SSLEngine On
JkMount /*.jsp ajp13
JkMount /servlet/* ajp13
&lt;/VirtualHost&gt;
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

        </blockquote></td></tr></table>

     </blockquote></td></tr></table>

  </blockquote></td></tr></table>

  <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="IIS 4.x and 5.x"><strong>IIS 4.x and 5.x</strong></a></font></td></tr><tr><td><blockquote>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Introduction"><strong>Introduction</strong></a></font></td></tr><tr><td><blockquote>

        <p>This section explains how to set up IIS 4.0 or newer to cooperate 
        with Tomcat 4. Normally IIS cannot execute Servlets and Java Server
        Pages (JSPs), configuring IIS to use Tomcat redirector plugin 
        will allow IIS to redirect Servlet and JSP requests to Tomcat.</p>

        <p>The Tomcat redirector for IIS is composed of four entities:
        <ul>
           <li>isapi_redirect.dll - The IIS server plugin, either obtain a 
           pre-built DLL or build it yourself (see the build section).</li>
           <li>worker.properties - A file that describes the host(s) and 
           port (s) used by the workers (Tomcat processes).</li>
           <li>uriworkermap.properties - A file that maps URL-Path patterns 
           to workers.</li>
           <li>iis_redirect.reg - A file that creates registry entries 
           in the Windows registry.</li>
        </ul>
        </p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Installation"><strong>Installation</strong></a></font></td></tr><tr><td><blockquote>

        <p>Make sure the Tomcat AJP connector is properly declared in the
        Catalina configuration file.</p>

        <p>Download isapi_redirect.dll for Tomcat 3.3 release or use the 
        following 
        <a href="http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3/bin/win32/i386/">link</a>.
        </p>

        <p>You can then either manually define a few extra configuration files
        (read below), or use the automatic IISConfig to have Tomcat generate 
        them for you (see next section).</p>

        <p>The next step is to create worker.properties to help 
        isapi_redirect.dll to identify where to find Tomcat and its 
        configuration.</p>

        <p>Next, the ISAPI filter for Tomcat must be configured to redirect 
        requests for specific webapps to Tomcat.</p>

        <p>Then the <code>uriworkermap.properties</code> file must be created
        in <code>%CATALINA_HOME%\conf</code> directory.</p>

        <p>Note: See below for examples of the configuration files. Those 
        configuration files assume Tomcat is installed in the 
        <code>c:\jakarta-tomcat-4.0.1</code> directory.</p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Using IISConfig"><strong>Using IISConfig</strong></a></font></td></tr><tr><td><blockquote>

	  <p>Tomcat 4 provides extra flexability over Tomcat 3 in setting up 
	     the automatic generation of the IIS configuration file.  
	     However, this comes at the cost of a bit more complexity.  Each
	     time that Tomcat is started, it will write the configuration file
	     to <code>%CATALINA_HOME%/conf/auto/uriworkersmap.properties</code>.
             If enabled as a <code>Server</code> Listener, it will also write 
             the required registry entries to 
	     <code>%CATALINA_HOME%/conf/auto/iis_redirect.reg</code>. You may
	     enter the settings into the registry by double-clicking on this
	     file from the Windows Explorer.</p>

	  <p>To generate the global IIS directives (including the registry file),
	     you define a <code>Server</code> Listener:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
   &lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;
     &lt;Listener className="org.apache.ajp.tomcat4.config.IISConfig" /&gt;
     ...
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

          <p>To configure the individual context information, you then either
	     define a <code>Host</code> Listener or a <code>Context</code> 
	     Listener depending on if you are using virutal hosting or not.
	     Defining a <code>Host</code> Listener will include all of
	     the configurations for the <code>Contexts</code> under this host.
	     Using the <code>Context</code> Listener allows you the flexability
	     to configure the <code>Context</code> the same way even if it
	     is being served from several hosts.</p>

	  <p>Except for the placement of the <code>&lt;Listener ...&gt;</code>,
	     the syntax is virtualy identical for the <code>Host</code>
	     Listener and the <code>Context</code> Listener.  The examples that
	     follow will demonstrate the functionality for a <code>Host</code>
	     Listener.  The simplest configuration is:</p>

<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
    &lt;Host name="localhost" debug="0" appbase="webapps" &gt;
      &lt;Listener className="org.apache.ajp.tomcat4.config.IISConfig" 
          append="true" /&gt;
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>

        <p>It is possible to modify the output configuration file with the 
	   following attributes:</p>

	<table border="1" cellpadding="5"><tr><th width="15%" bgcolor="#023264"><font color="#ffffff">Attribute</font></th><th width="85%" bgcolor="#023264"><font color="#ffffff">Description</font></th></tr><tr><td align="left" valign="center"><code>configHome</code></td><td align="left" valign="center">
	    Default parent directory for the following paths. If not set, this
	     defaults to CATALINA_HOME. Ignored whenever any of the following 
	     paths is absolute.
	  </td></tr><tr><td align="left" valign="center"><code>regConfig</code></td><td align="left" valign="center">
	    Path to use for writing the registry settings configuration file.
	    If not set, defaults to "conf/auto/iis_redirect.reg".
	  </td></tr><tr><td align="left" valign="center"><code>uriConfig</code></td><td align="left" valign="center">
	  Path to use for writing the URI worker map configuration file.
	  If not set, defaults to  "conf/auto/uriworkermap.properties". 
	  </td></tr><tr><td align="left" valign="center"><code>workersConfig</code></td><td align="left" valign="center">
	    Path to workers.properties file used by mod_jk. If not set, 
	    defaults to "conf/jk/workers.properties". 
	  </td></tr><tr><td align="left" valign="center"><code>jkLog</code></td><td align="left" valign="center">
	  path to log file to be used by mod_jk
	  </td></tr><tr><td align="left" valign="center"><code>jkDebug</code></td><td align="left" valign="center">
	    JK Loglevel setting. May be debug, info, error, or emerg. If not 
	    set, defaults to no emerg. 
	  </td></tr><tr><td align="left" valign="center"><code>jkWorker</code></td><td align="left" valign="center">
	    The desired worker. Must be set to one of the workers defined in 
	    the workers.properties file.  "ajp13" or "inprocess" are 
	    the workers found in the default workers.properties file. If not 
	    specified, defaults to "ajp13".
	  </td></tr><tr><td align="left" valign="center"><code>forwardAll</code></td><td align="left" valign="center">
	    If true, forward all requests to Tomcat. This helps ensure that 
	    all the behavior configured in the web.xml file functions 
	    correctly. If false, let IIS serve static resources. The 
	    default is true. Warning: When false, some configuration in the 
	    web.xml may not be duplicated in IIS. Review the mod_jk conf 
	    file to see what configuration is actually being set in IIS. 
	  </td></tr><tr><td align="left" valign="center"><code>noRoot</code></td><td align="left" valign="center">
	  If true, the root context is not mapped to Tomcat. If false and 
	  forwardAll is true, all requests to the root context are mapped to 
	  Tomcat. If false and forwardAll is false, only JSP and servlets 
	  requests to the root context are mapped to Tomcat. When false, to 
	  correctly serve Tomcat's root context you must also modify the 
	  DocumentRoot setting in IIS's httpd.conf file to point to 
	  Tomcat's root context directory. Otherwise some content, such as 
	  IIS's index.html, will be served by IIS before mod_jk gets a 
	  chance to claim the request and pass it to Tomcat. The default is 
	  true.</td></tr><tr><td align="left" valign="center"><code>append</code></td><td align="left" valign="center">
	    Append to the current configuration file.
	  </td></tr></table>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Configuring IIS"><strong>Configuring IIS</strong></a></font></td></tr><tr><td><blockquote>

        <p>
        <ul>
           <li>Launch Internet Service Manager</li>
           <li>Stop the Web Site if it is running</li>
           <li>Create a virtual directory, by clicking on the default 
               web site
              <ul>
                 <li>Type the alias to say jakarta, press Next</li>
                 <li>Set the directory to <code>%CATALINA_HOME%\bin</code>
                     where you installed isapi_redirect.dll, press next</li>
                 <li>Provide only read and execute privileges for 
                     security purposes</li>
              </ul>
           </li>
           <li>Add a filter to the default web site, using the 
           IIS Management Console, right click on the properties and 
           go to ISAPI filters tab. Press Add button, 
           add isapi_redirect.dll as a filter the name of the filter 
           should reflect its task (for example, "Jakarta Redirector"). 
           The Executable field should point to the place where we installed 
           isapi_redirect.dll, in our case 
           <code>%CATALINA_HOME%\bin\isapi_redirect.dll</code></li>
           <li>If not done yet, enter the keys from 
           <code>iis_redirect.reg</code> in the Windows registry (this can
           be done by double-clicking on the file in the explorer).
           Note: When manually creating the file (maybe from the example given
           below), remember to correct the directories where Tomcat 
           is installed.</li>
           <li>Startup IIS.</li>
           <li>Go to the Properties of the web site and select the ISAPI 
           filters tab to make sure that the ISAPI filter got registered 
           correctly. It should have a Green arrow alongside it. 
           Note: it is recommended to restart computer for the ISAPI filter 
           to load.</li>
        </ul>
        </p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Sample worker.properties file"><strong>Sample worker.properties file</strong></a></font></td></tr><tr><td><blockquote>

        <p>
<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
# ************ Begin worker.properties **************
worker.ajp13.type=ajp13

#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
#  ----&gt; lbfactor must be &gt; 0
#  ----&gt; Low lbfactor means less work done by the worker.
worker.ajp13.lbfactor=1

#
# Specify the size of the open connection cache.
#worker.ajp13.cachesize

#
#------ DEFAULT LOAD BALANCER WORKER DEFINITION ----------------------
#---------------------------------------------------------------------
#

#
# The loadbalancer (type lb) worker perform weighted round-robin
# load balancing with sticky sessions.
# Note:
#  ----&gt; If a worker dies, the load balancer will check its state
#        once in a while. Until then all work is redirected to peer
#        worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp13

#
# worker.tomcat_home should point to the location where you
# installed tomcat. This is where you have your conf, webapps and lib
# directories.
#
worker.tomcat_home=C:\jakarta-tomcat-4.0.1

#
# worker.java_home should point to your Java installation. Normally
# you should have a bin and lib directories beneath it.
#
worker.java_home=C:\jdk1.3.1

#
# You should configure your environment slash... ps=\ on NT and / on UNIX
# and maybe something different elsewhere.
#
ps=\

#
#------ ADVANCED MODE ------------------------------------------------
#---------------------------------------------------------------------
#

#
#------ DEFAULT worker list ------------------------------------------
#---------------------------------------------------------------------
#
# The worker that your plugins should create and work with
worker.list=ajp13

#
#------ DEFAULT ajp13 WORKER DEFINITION ------------------------------
#---------------------------------------------------------------------
#

#
# Defining a worker named ajp13 and of type ajp13
# Note that the name and the type do not have to match.
#
worker.ajp13.port=8009
worker.ajp13.host=localhost

# ************ End worker.properties **************
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
        </p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="Sample uriworkermap.properties"><strong>Sample uriworkermap.properties</strong></a></font></td></tr><tr><td><blockquote>

        <p>
<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
# *********** Begin uriworkermap.properties ***
#
# Simple worker configuration file
#

# Mount the Servlet context to the ajp13 worker
/servlet/*=ajp13

# Mount the examples context to the ajp13 worker
/examples/*=ajp13

# Advanced mount of the examples context
# /examples/servlet/*=ajp13
# ************* End uriworkermap.properties ****
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
        </p>

     </blockquote></td></tr></table>

     <table border="0" cellspacing="0" cellpadding="2"><tr><td bgcolor="#828DA6"><font color="#ffffff" face="arial,helvetica.sanserif"><a name="iis_redirect.reg"><strong>iis_redirect.reg</strong></a></font></td></tr><tr><td><blockquote>

        <p>
<div align="left"><table cellspacing="4" cellpadding="0" border="0"><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#ffffff" height="1"><pre>
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Jakarta Isapi Redirector\1.0]
"extension_uri"="/jakarta/isapi_redirect.dll"
"log_file"="C:\\jakarta-tomcat-4.0.1\\logs\\iis_redirect.log"
"log_level"="emerg"
"worker_file"="C:\\jakarta-tomcat-4.0.1\\conf\\worker.properties"
"worker_mount_file"="C:\\jakarta-tomcat-4.0.1\\conf\\uriworkermap.properties"
</pre></td><td bgcolor="#023264" width="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr><tr><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td><td bgcolor="#023264" width="1" height="1"><img src="../../images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"></td></tr></table></div>
        </p>

     </blockquote></td></tr></table>

  </blockquote></td></tr></table>

</blockquote></td></tr></table></td></tr><!--FOOTER SEPARATOR--><tr><td colspan="2"><hr noshade size="1"></td></tr><!--PAGE FOOTER--><tr><td colspan="2"><div align="center"><font color="#525D76" size="-1"><em>
        Copyright &copy; 1999-2009, Apache Software Foundation
        </em></font></div></td></tr></table></body></html>